<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 1.用扩展符 缺点：只能实现第一层 多层就是浅拷贝
    // var obj = {
    //     name: '张三',
    //     age: 45,
    //     score: {
    //         math: 55,
    //         yuwen: 44
    //     },
    //     say(){
    //         console.log("我会唱歌");
    //     }
    // }
    // var obj1 = { ...obj }
    // obj1.name = '李四'
    // obj1.score.yuwen = 1000
    // console.log(obj);
    // console.log(obj.name);
    // console.log(obj1.name);
    // console.log(obj.score.yuwen);
    // console.log(obj1.score.yuwen);
    // console.log(obj1);

    // 2.JSON.parse(JSON.stringify()) 缺点：不能拷贝函数
    // var obj = {
    //     name: '张三',
    //     age: 45,
    //     score: {
    //         math: 55,
    //         yuwen: 44
    //     },
    //     say() {
    //         console.log("我会唱歌");
    //     }
    // }
    // var obj1 = JSON.parse(JSON.stringify(obj))
    // obj1.score.yuwen = 1000
    // obj1.name = '王五'
    // obj1.age = 500
    // console.log(obj);
    // console.log(obj1);

    // 3.手写一个深拷贝
    var obj = {
        name: '强哥',
        color: ['pink', 'blue', 'orange'],
        student: {
            age: 55,
            food: 'meat'
        },
        sing() {
            console.log("我喜欢唱歌");
        }
    }

    function deepCopy(obj) {
        // 如果obj不是数组,对象或者为空则返回obj
        if (typeof obj !== 'object' || obj == null) {
            return obj
        }
        let result;
        if (obj instanceof Array) {
            result = []
        } else {
            result = {}
        }

        // 循环
        // result[name]=obj[name]
        // 这样result里面就会多一个name属性等于强哥
        for (let key in obj) {
            result[key] = deepCopy(obj[key])
        }

        return result
    }

    const newObj1 = deepCopy(obj)
    newObj1.name = '启强'
    newObj1.student.age = 60
    newObj1.color[0] = 'purple'
    newObj1.sing()
    console.log(obj);
    console.log(newObj1); 


</script>
</html>